home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / COMMS / ATTACHER.ZIP / !Attacher / C / Vers102 < prev   
Text File  |  1998-02-01  |  52KB  |  1,714 lines

  1. /* Title:   !Attacher      */
  2.  
  3. #include "wimp.h"
  4. #include "wimpt.h"
  5. #include "win.h"
  6. #include "event.h"
  7. #include "baricon.h"
  8. #include "res.h"
  9. #include "resspr.h"
  10. #include "menu.h"
  11. #include "template.h"
  12. #include "dbox.h"
  13. #include "dboxquery.h"
  14. #include "werr.h"
  15. #include "visdelay.h"
  16. #include "SWItable.h"
  17. #include "msgs.h"
  18. #include "help.h"
  19.  
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <stdio.h>
  23. #include <kernel.h>
  24.  
  25. /******************************** GLOBAL DATA *****************************/
  26.  
  27. static BOOL my_win_open = FALSE;
  28. static BOOL unsafe_data = FALSE;
  29. static BOOL ok_not_grey = FALSE;
  30. static BOOL already_been_open = FALSE;
  31. static BOOL split_file = FALSE;
  32. static BOOL keep_ext = FALSE;
  33. static BOOL uu_add_ext = FALSE;
  34. static BOOL base64_add_ext = FALSE;
  35. static BOOL splitting_file = FALSE;
  36. static BOOL already_found_a_file = FALSE;
  37. static BOOL processing_uucode = FALSE;
  38. static BOOL processing_base64 = FALSE;
  39. static BOOL found_end = FALSE;
  40. static BOOL prequit = FALSE;
  41.  
  42. static _kernel_oserror *pos_error;
  43. static int part_number, split_length, old_split_length, drag_filetype;
  44. static int file_length, chars_read, max_chars, no_parts, total_read;
  45. static int Slen, Mchar, help_icon;
  46. static menu my_menu;
  47. static dbox info_box_handle, split_box_handle, links_box_handle;
  48. static wimp_w action_win_handle, split_win_handle;
  49. static wimp_i my_ibar_icon;
  50. static wimp_caretstr caret_pos;
  51. static wimp_icon result;
  52. static wimp_wstate state;
  53. static char file_sprite[10], file_uua[255], file_uub[255];
  54. static char my_line[255], my_line2[255], my_line3[255], base64_default[100];
  55. static char split_prefix[255], split_suffix[50], default_file[100];
  56. static char *st_result, version_num[10], source_name[55];
  57. static char scrap_dir[256], file_to_code[214];
  58. static FILE *input_file, *output_file;
  59. static fpos_t *file_index, file_position;
  60. static wimp_msgstr open, msg;
  61. static _kernel_swi_regs r;
  62.  
  63. enum TOKENTYPE { NONE, BLANKS, PUNCT, TAG, NAME, CONTENT };
  64. struct TOKEN {
  65.                 char *text;
  66.                 int  length;
  67.                 int  index;
  68.                 enum TOKENTYPE type;
  69.              };
  70.  
  71. #define icon_help 0
  72. #define icon_decode 1
  73. #define icon_uuencode 2
  74. #define icon_64encode 3
  75. #define icon_info 4
  76. #define icon_savefile 5
  77. #define icon_savebutton 6
  78. #define icon_filename 7
  79. #define icon_cancel 8
  80. #define icon_discard 10
  81.  
  82. /********************** GENERAL EVENT HANDLERS ****************************/
  83.  
  84. static void text_in_icon(wimp_w this_window,wimp_i this_icon,char *this_text)
  85. {
  86.   wimp_get_icon_info(this_window,this_icon,&result);
  87.   strcpy(result.data.indirecttext.buffer,this_text);
  88.   wimp_set_icon_state(this_window,this_icon,0,0);
  89. }
  90.  
  91. static void reset_main_window()
  92. {
  93.   text_in_icon(action_win_handle,icon_filename,"");
  94.   wimp_set_icon_state(action_win_handle,icon_filename,0x400000,0x400000);
  95.   wimp_set_icon_state(action_win_handle,icon_savebutton,0x400000,0x400000);
  96.   text_in_icon(action_win_handle,icon_info,"Drag a file to one of the code or decode icons");
  97.   text_in_icon(action_win_handle,icon_help, "");
  98.   wimp_get_icon_info(action_win_handle,icon_savefile,&result);
  99.   strcpy(result.data.indirecttext.validstring,"s!attacher");  
  100.   wimp_set_icon_state(action_win_handle,icon_savefile,0x1700011b,0xffffffff);
  101.   wimp_set_icon_state(action_win_handle,icon_decode,0x2700013f,0xffffffff);
  102.   wimp_set_icon_state(action_win_handle,icon_uuencode,0x2700013f,0xffffffff);
  103.   wimp_set_icon_state(action_win_handle,icon_64encode,0x2700013f,0xffffffff);
  104.   ok_not_grey = FALSE;
  105. }
  106.  
  107. static void open_main_window()
  108. {
  109.   if(!my_win_open)
  110.     {
  111.       reset_main_window();
  112.       wimp_get_wind_state(action_win_handle,&state);
  113.       state.o.behind=-1;
  114.       if (!already_been_open)
  115.       {
  116.         state.o.box.x0 = 158;
  117.         state.o.box.y0 = 288;
  118.         state.o.box.x1 = 1000;
  119.         state.o.box.y1 = 788;
  120.       }  
  121.       wimp_open_wind(&state.o);
  122.       my_win_open = TRUE;
  123.       already_been_open = TRUE;
  124.     }
  125. }
  126.  
  127. static void my_iconclick(wimp_i icon)
  128. {
  129.   icon=icon;
  130.   
  131.   if(my_win_open)
  132.   {
  133.     wimp_get_wind_state(action_win_handle,&state);
  134.     state.o.behind=-1;
  135.     wimp_open_wind(&state.o);    
  136.   }
  137.   else open_main_window();
  138. }
  139.  
  140. static void return_to_wimp()
  141. {
  142.   wimp_eventstr dummy_event;
  143.   
  144.   visdelay_end();
  145.   wimp_poll(0,&dummy_event);
  146.   visdelay_begin();
  147. }
  148.  
  149. static void exit_function()
  150. {
  151.   if (prequit)
  152.   {
  153.     r.r[0] = 27;
  154.     r.r[1] = (int) "<Wimp$ScrapDir>.Attacher";
  155.     r.r[3] = 1;
  156.     _kernel_swi(OS_FSControl, &r, &r);
  157.   }
  158. }
  159.  
  160. static void process_help_message(wimp_eventstr *e)
  161. {
  162.   if(e->data.msg.data.helprequest.m.i == my_ibar_icon && e->data.msg.data.helprequest.m.w == -2) 
  163.   {
  164.     help_reply(msgs_lookup("Ibar:This is UUcoder"));
  165.     return;
  166.   }
  167.   if(e->data.msg.data.helprequest.m.w == action_win_handle)
  168.   {
  169.     switch(e->data.msg.data.helprequest.m.i)
  170.     {
  171.       case 1:
  172.         help_reply(msgs_lookup("Action1"));
  173.         break;
  174.       case 2:
  175.         help_reply(msgs_lookup("Action2"));
  176.         break;
  177.       case 3:
  178.         help_reply(msgs_lookup("Action3"));
  179.         break;
  180.       case 6:
  181.         help_reply(msgs_lookup("Action6"));
  182.         break;
  183.       case 7:
  184.         help_reply(msgs_lookup("Action7"));
  185.         break;
  186.       case 8:
  187.         help_reply(msgs_lookup("Action8"));
  188.         break;
  189.       case 9:
  190.         help_reply(msgs_lookup("Action9"));
  191.         break;
  192.       case 10:
  193.         help_reply(msgs_lookup("Actiona"));
  194.         break;
  195.       case 5:
  196.         if (ok_not_grey) help_reply(msgs_lookup("Action5"));
  197.         else help_reply(msgs_lookup("Action"));
  198.         break;
  199.       default:
  200.         help_reply(msgs_lookup("Action"));
  201.     }
  202.   }      
  203. }
  204.   
  205. static void split_fname()
  206. {
  207.   part_number = part_number + 1;
  208.   sprintf(my_line, "%s%02d%s", split_prefix, part_number, split_suffix);
  209.   text_in_icon(action_win_handle ,icon_filename, my_line);
  210.   if(part_number != 1)
  211.   {
  212.     caret_pos.w = action_win_handle;
  213.     caret_pos.i = icon_filename;
  214.     caret_pos.index = strlen (my_line);
  215.     caret_pos.height = -1;
  216.     wimp_set_caret_pos(&caret_pos);
  217.   }
  218. }
  219.  
  220. static BOOL save_split_file(char *filename)
  221. {
  222.   div_t div_result;
  223.   
  224.   output_file = fopen(filename, "wb");
  225.   if (output_file == NULL)
  226.   {
  227.     werr(FALSE,msgs_lookup("error7:Cannot save file here"));
  228.     text_in_icon(action_win_handle,icon_info,"Section coded and ready to save");
  229.     return FALSE;
  230.   }
  231.   input_file = fopen(file_uub,"rb");
  232.   if(part_number != 1) 
  233.   {
  234.     fsetpos(input_file, file_index);
  235.     fprintf(output_file,"%s part %d/%d  [uuencoded by RISC OS Attacher v%s]\n\n-------- CUT -------- CUT -------- CUT -------- CUT ---------\n", source_name,part_number,no_parts,version_num);
  236.   }
  237.   else
  238.   {
  239.     max_chars = (split_length * 1000) - 500;
  240.     div_result = div(max_chars, 62);
  241.     max_chars = div_result.quot * 62;
  242.     total_read = 0;
  243.     div_result = div(file_length, max_chars);
  244.     if (div_result.rem == 0) no_parts = div_result.quot;
  245.     else no_parts = div_result.quot + 1;
  246.   }  
  247.   chars_read = 0;
  248.   if(((file_length-total_read-max_chars) > 0) && ((file_length-total_read-max_chars) < 500)) max_chars = max_chars - 500;
  249.   while((chars_read < max_chars) && splitting_file)
  250.   {
  251.     st_result = fgets(my_line, 255, input_file);
  252.     if (st_result != NULL)
  253.     {
  254.       fputs(my_line, output_file);
  255.       chars_read = chars_read + strlen(my_line);
  256.     }
  257.     else splitting_file = FALSE;
  258.   } 
  259.   total_read = total_read + chars_read; 
  260.   if (splitting_file) 
  261.   {
  262.     fgetpos(input_file, file_index);
  263.     fprintf(output_file,"-------- CUT -------- CUT -------- CUT -------- CUT ---------\n\n%s part %d/%d  [uuencoded by RISC OS Attacher v%s]\n", source_name,part_number,no_parts,version_num);
  264.   }
  265.   fclose(input_file);
  266.   fclose(output_file);
  267.   r.r[0] = 18;
  268.   r.r[1] = (int) filename;
  269.   r.r[2] = 0xfff;
  270.   _kernel_swi(OS_File, &r, &r);
  271.   if (splitting_file)
  272.   {
  273.     split_fname();
  274.     text_in_icon(action_win_handle,icon_info,"Next section of uuencoded file ready to save");
  275.   }
  276.   else 
  277.   {
  278.     remove (file_uub);
  279.     caret_pos.w = action_win_handle;
  280.     caret_pos.i = -1;
  281.     wimp_set_caret_pos(&caret_pos);
  282.     wimp_get_wind_state(action_win_handle, &state);
  283.     wimp_close_wind(action_win_handle);
  284.     reset_main_window();
  285.     wimp_open_wind(&state.o);
  286.     unsafe_data = FALSE;
  287.   }
  288.   return TRUE;
  289. }  
  290.  
  291. static void handle_link()
  292. {
  293.   dbox_field field_number;
  294.   wimp_eventstr e;
  295.   
  296.   strcpy(msg.data.chars, "");
  297.   dbox_show(links_box_handle);
  298.   field_number = dbox_fillin(links_box_handle);
  299.   switch (field_number)
  300.   {
  301.     case 0:
  302.       strcpy(msg.data.chars, "http://www.bramber.demon.co.uk/software/attach.zip");
  303.       break;
  304.         
  305.     case 3:
  306.       strcpy(msg.data.chars, "http://www.bramber.demon.co.uk/john/atin.html");
  307.       break;
  308.         
  309.     case 4:
  310.       strcpy(msg.data.chars, "http://www.bramber.demon.co.uk/john/athis.html");
  311.       break;
  312.         
  313.     case 5:
  314.       strcpy(msg.data.chars, "http://www.bramber.demon.co.uk/john/soft.html");
  315.       break;
  316.           
  317.     case 6:
  318.       strcpy(msg.data.chars, "mailto:john@bramber.demon.co.uk");
  319.       break;
  320.   }
  321.   dbox_hide(links_box_handle);
  322.   if (strlen(msg.data.chars) == 0) return;
  323.   msg.hdr.size = 256;
  324.   msg.hdr.your_ref = 0;
  325.   msg.hdr.action = 0x4af80; 
  326.   wimp_sendmessage(18, &msg, 0);
  327.   wimp_poll( 0x1973, &e);
  328.   if((e.e == wimp_ESENDWANTACK) && (e.data.msg.hdr.action ==  wimp_MDATAOPEN)) wimp_poll( 0x1973, &e);
  329.   if (field_number == 6) 
  330.   {
  331.     os_read_var_val("Alias$URLOpen_mailto", my_line, 255);
  332.     if (strlen(my_line) != 0)
  333.     {
  334.       if (strstr(my_line, "Messenger") != NULL)
  335.       {
  336.         strcpy(my_line, "URLOpen_mailto ");
  337.         strcat(my_line, msg.data.chars);
  338.         wimp_starttask(my_line);
  339.       }
  340.     }
  341.   }
  342.   else 
  343.   {
  344.     os_read_var_val("Alias$URLOpen_HTTP", my_line, 255);
  345.     if (strlen(my_line) != 0)
  346.     {
  347.       if (strstr(my_line, "ArcWeb") != NULL)
  348.       {
  349.         strcpy(my_line, "URLOpen_HTTP ");
  350.         strcat(my_line, msg.data.chars);
  351.         wimp_starttask(my_line);
  352.       }
  353.     }
  354.   }  
  355. }
  356.  
  357. static void convert_sprite_details()
  358. {
  359.   sprintf(file_sprite, "file_%03x\0", drag_filetype);
  360.   if(wimp_spriteop(40,file_sprite) != 0) strcpy(file_sprite,"file_xxx");
  361. }
  362.  
  363. static void start_the_drag()
  364. {
  365.   int wind_limit, wind_factor;
  366.   wimp_dragstr drag;
  367.   
  368.   drag.window = action_win_handle;
  369.   drag.type = 5;
  370.   drag.parent.x0 = -20;
  371.   drag.parent.y0 = -20;
  372.   r.r[0] = -1;
  373.   r.r[1] = 11;
  374.   _kernel_swi(OS_ReadModeVariable, &r, &r);
  375.   wind_limit = r.r[2];
  376.   r.r[0] = -1;
  377.   r.r[1] = 4;
  378.   _kernel_swi(OS_ReadModeVariable, &r, &r);
  379.   wind_factor = r.r[2];
  380.   drag.parent.x1 = (wind_limit <<wind_factor) + 20;
  381.   r.r[0] = -1;
  382.   r.r[1] = 12;
  383.   _kernel_swi(OS_ReadModeVariable, &r, &r);
  384.   wind_limit = r.r[2];
  385.   r.r[0] = -1;
  386.   r.r[1] = 5;
  387.   _kernel_swi(OS_ReadModeVariable, &r, &r);
  388.   wind_factor = r.r[2];
  389.   drag.parent.y1 = (wind_limit << wind_factor) + 20;  
  390.   wimp_get_icon_info(action_win_handle, icon_savefile, &result);
  391.   wimp_get_wind_state(action_win_handle, &state);
  392.   drag.box.x0 = result.box.x0 + state.o.box.x0 + 40;
  393.   drag.box.x1 = result.box.x1 + state.o.box.x0 - 40;
  394.   drag.box.y0 = result.box.y0 + state.o.box.y1 + 38;
  395.   drag.box.y1 = result.box.y1 + state.o.box.y1 - 40;
  396.   r.r[0] = 161;
  397.   r.r[1] =28;
  398.   _kernel_swi(OS_Byte, &r, &r);
  399.   if((r.r[2] & 2) == 2) 
  400.   {
  401.     convert_sprite_details();
  402.     r.r[0] = 197;
  403.     r.r[1] = 1;
  404.     r.r[2] = (int) &file_sprite;
  405.     r.r[3] = (int) &drag.box;
  406.     r.r[4] = (int) &drag.parent;
  407.     _kernel_swi(DragASprite_Start, &r, &r);
  408.   }
  409.   else wimp_drag_box(&drag);
  410. }
  411.  
  412. static void reply_with_scrap(wimp_eventstr *e)
  413. {
  414.   e->data.msg.hdr.your_ref = e->data.msg.hdr.my_ref;
  415.   e->data.msg.hdr.action = wimp_MDATASAVEOK;
  416.   e->data.msg.hdr.size = 256;
  417.   e->data.msg.data.datasaveok.estsize = -1;
  418.   sprintf(e->data.msg.data.datasaveok.name,"<Wimp$ScrapDir>.Attacher.!!Scrap!!");
  419.   wimpt_noerr(wimp_sendmessage(wimp_ESENDWANTACK,&e->data.msg,e->data.msg.hdr.task));
  420. }
  421.  
  422. static void acknowledge_receipt(wimp_eventstr *e)
  423. {
  424.   e->data.msg.hdr.your_ref = e->data.msg.hdr.my_ref;
  425.   e->data.msg.hdr.action = wimp_MDATALOADOK;
  426.   wimpt_noerr(wimp_sendmessage(wimp_ESEND,&e->data.msg,e->data.msg.hdr.task));
  427. }
  428.  
  429. static void load_choices_vals()
  430. {
  431.   dbox_getfield(split_box_handle, 8, split_prefix, 255);
  432.   dbox_getfield(split_box_handle, 10, split_suffix, 50);
  433.   dbox_getfield(split_box_handle, 14, default_file,255);
  434.   dbox_getfield(split_box_handle, 26, base64_default,255);
  435.   split_length = dbox_getnumeric(split_box_handle, 4);
  436.   if (split_length < 2) split_length = 2;
  437.   dbox_setnumeric(split_box_handle, 4, split_length);
  438.   wimp_get_icon_info(split_win_handle, 1, &result);
  439.   if((result.flags & wimp_ISELECTED) == 0) split_file = FALSE;
  440.   else split_file =TRUE;
  441.   wimp_get_icon_info(split_win_handle, 24, &result);
  442.   if((result.flags & wimp_ISELECTED) == 0) keep_ext = FALSE;
  443.   else keep_ext = TRUE;
  444.   wimp_get_icon_info(split_win_handle, 28, &result);
  445.   if((result.flags & wimp_ISELECTED) == 0) uu_add_ext = FALSE;
  446.   else uu_add_ext = TRUE;
  447.   wimp_get_icon_info(split_win_handle, 29, &result);
  448.   if((result.flags & wimp_ISELECTED) == 0) base64_add_ext = FALSE;
  449.   else base64_add_ext = TRUE;
  450. }
  451.  
  452. static void handle_uu_choices()
  453. {
  454.   BOOL keep_loop = TRUE;
  455.   wimp_iconflags old_flags, old_flags1, old_flags2, old_flags3;
  456.   BOOL old_uu_add_ext, old_base64_add_ext, old_keep_ext, old_split_file;
  457.      
  458.   dbox_show(split_box_handle);
  459.   old_split_file = split_file;
  460.   old_keep_ext = keep_ext;
  461.   old_uu_add_ext = uu_add_ext;
  462.   old_base64_add_ext = base64_add_ext;
  463.   wimp_get_icon_info(split_win_handle, 1, &result);
  464.   old_flags = result.flags;
  465.   wimp_get_icon_info(split_win_handle, 24, &result);
  466.   old_flags1 = result.flags;
  467.   wimp_get_icon_info(split_win_handle, 28, &result);
  468.   old_flags2 = result.flags;
  469.   wimp_get_icon_info(split_win_handle, 29, &result);
  470.   old_flags3 = result.flags;
  471.   old_split_length = dbox_getnumeric(split_box_handle, 4);
  472.   while (keep_loop)
  473.   {
  474.     switch(dbox_fillin(split_box_handle))
  475.     {
  476.       case 5:
  477.         dbox_hide(split_box_handle);
  478.         load_choices_vals();
  479.         keep_loop = FALSE;
  480.         break;
  481.             
  482.       case 6:
  483.         split_length = dbox_getnumeric(split_box_handle, 4);
  484.         split_length = split_length - 1;
  485.         if (split_length < 2) split_length = 2;
  486.         dbox_setnumeric(split_box_handle, 4, split_length);
  487.         break;
  488.           
  489.       case 7:
  490.         split_length = dbox_getnumeric(split_box_handle, 4);
  491.         split_length = split_length + 1;
  492.         dbox_setnumeric(split_box_handle, 4, split_length);
  493.         break;
  494.       
  495.       case 11:
  496.         dbox_hide(split_box_handle);
  497.         load_choices_vals();
  498.         keep_loop = FALSE;
  499.         output_file = fopen("<Attacher$Dir>.Choices","wb");
  500.         if (output_file == NULL)
  501.         {
  502.           werr(FALSE, msgs_lookup("error4:Cannot create Choices file"));
  503.           break;
  504.         }
  505.         if (split_file) fputs("0\n", output_file);
  506.         else fputs("1\n", output_file);
  507.         split_length = dbox_getnumeric(split_box_handle, 4);
  508.         if (split_length < 2) split_length = 2;
  509.         dbox_setnumeric(split_box_handle, 4, split_length);
  510.         fprintf(output_file,"%u\n",split_length);
  511.         fprintf(output_file,"%s\n",split_prefix);
  512.         fprintf(output_file,"%s\n",split_suffix);
  513.         fprintf(output_file,"%s\n",default_file);
  514.         fprintf(output_file,"%s\n",base64_default);
  515.         if (keep_ext) fputs("0\n", output_file);
  516.         else fputs("1\n", output_file);
  517.         if (uu_add_ext) fputs("0\n", output_file);
  518.         else fputs("1\n", output_file);
  519.         if (base64_add_ext) fputs("0\n", output_file);
  520.         else fputs("1\n", output_file);
  521.         fclose(output_file);
  522.         break;      
  523.  
  524.       case 9:
  525.       default:
  526.         dbox_hide(split_box_handle);
  527.         split_file = old_split_file;
  528.         keep_ext = old_keep_ext;
  529.         uu_add_ext = old_uu_add_ext;
  530.         base64_add_ext = old_base64_add_ext;
  531.         wimp_set_icon_state(split_win_handle, 1, old_flags, 0xffffffff);
  532.         wimp_set_icon_state(split_win_handle, 24, old_flags1, 0xffffffff);
  533.         wimp_set_icon_state(split_win_handle, 28, old_flags2, 0xffffffff);
  534.         wimp_set_icon_state(split_win_handle, 29, old_flags3, 0xffffffff);
  535.         dbox_setnumeric(split_box_handle, 4, old_split_length);
  536.         split_length = dbox_getnumeric(split_box_handle, 4);
  537.         dbox_setfield(split_box_handle, 8, split_prefix);
  538.         dbox_setfield(split_box_handle, 10, split_suffix);
  539.         dbox_setfield(split_box_handle, 14, default_file);
  540.         dbox_setfield(split_box_handle, 26, base64_default);
  541.         keep_loop = FALSE;
  542.         break;
  543.     }
  544.   }
  545. }
  546.  
  547. static void check_scrap_exists()
  548. {
  549.   FILE *file_1;
  550.   
  551.   file_1 = fopen("<Wimp$ScrapDir>.Attacher", "w");
  552.   if(file_1 != NULL)
  553.   {
  554.     fclose(file_1);
  555.     remove("<Wimp$ScrapDir>.Attacher");  
  556.     strcpy(scrap_dir, "<Wimp$ScrapDir>.Attacher");
  557.     r.r[0] = 8;
  558.     r.r[1] = (int) scrap_dir;
  559.     _kernel_swi(OS_File, &r, &r);
  560.     sprintf(file_uua, "%s.!!uua!!\0", scrap_dir);
  561.     sprintf(file_uub, "%s.!!uub!!\0", scrap_dir);
  562.   }
  563. }  
  564.  
  565. static void test_for_full_scrap()
  566. {
  567.   FILE *file_1, *file_2, *file_3;
  568.   char file_full[256], file_fuller[256];
  569.   
  570.   if (unsafe_data) return;
  571.   check_scrap_exists();
  572.   
  573.   file_1 = fopen(file_uub, "w");
  574.   sprintf(file_full, "%s.!ghfddgopq\0", scrap_dir);
  575.   file_2 = fopen(file_full, "w");
  576.   sprintf(file_fuller, "%s.!ghfdskdwq\0", scrap_dir);
  577.   file_3 = fopen(file_fuller, "w");
  578.   if (file_3 == NULL)
  579.   {
  580.     fclose(file_1);
  581.     fclose(file_2);
  582.     remove(file_uub);
  583.     remove(file_fuller);
  584.     strcat(scrap_dir, ".~zq");
  585.     r.r[0] = 8;
  586.     r.r[1] = (int) scrap_dir;
  587.     _kernel_swi(OS_File, &r, &r);
  588.     sprintf(file_uua, "%s.!!uua!!\0", scrap_dir);
  589.     sprintf(file_uub, "%s.!!uub!!\0", scrap_dir);
  590.     return;
  591.   }
  592.   fclose(file_1);
  593.   fclose(file_2);
  594.   fclose(file_3);
  595.   remove(file_uub);
  596.   remove(file_full);
  597.   remove(file_fuller);
  598. }
  599.  
  600. /******************************** saving files ***************************/
  601.  
  602. static void setup_to_save(char *fname, int ftype, int indicator)
  603. {
  604.   int i, len;
  605.   char invalid_chars[20], *inv_point, *invalid_char;
  606.   
  607.   wimp_set_icon_state(action_win_handle,icon_decode,0x400000,0x400000);
  608.   wimp_set_icon_state(action_win_handle,icon_uuencode,0x400000,0x400000);
  609.   wimp_set_icon_state(action_win_handle,icon_64encode,0x400000,0x400000);
  610.   len = strlen(fname) + 1;
  611.   for(i=0; i<=len; i++) if((int) fname[i] < 32) fname[i] = 0;
  612.   strcpy(invalid_chars, " &@%*#^$:,|\x5c\x22");
  613.   for (i=0; i<strlen(invalid_chars); i++)
  614.   {
  615.     inv_point = invalid_chars + 1;
  616.     invalid_char = fname - 1;
  617.     while (invalid_char != NULL)
  618.     {
  619.       invalid_char = strchr(invalid_char+1, invalid_chars[i]);
  620.       if((invalid_char != NULL)  && (*invalid_char == 44)) *invalid_char = 0;
  621.       else if (invalid_char != NULL) *invalid_char = 95;
  622.     }
  623.   }
  624.   if((indicator == 1) && split_file)
  625.   {
  626.     r.r[0] = 17;
  627.     r.r[1] = (int) file_uub;
  628.     _kernel_swi(OS_File, &r, &r);
  629.     file_length = r.r[4];
  630.     if (file_length > (split_length * 1000))
  631.     {
  632.       part_number = 0;
  633.       split_fname();
  634.       splitting_file = TRUE;
  635.     }
  636.   }
  637.   if (!splitting_file) 
  638.   {
  639.     text_in_icon(action_win_handle, icon_filename, fname);
  640.     text_in_icon(action_win_handle, icon_info, "File ready to save, double click, or drag the file icon, or click on 'Save'");
  641.   }
  642.   else text_in_icon(action_win_handle, icon_info, "First part of file ready to save, double click, or drag, or click on 'Save'");
  643.   sprintf(my_line, "R2;sfile_%03x\0", ftype);
  644.   wimp_get_icon_info(action_win_handle,icon_savefile,&result);
  645.   strcpy(result.data.indirecttext.validstring,my_line);  
  646.   wimp_set_icon_state(action_win_handle,icon_savefile,0x813f,0xffff);
  647.   wimp_set_icon_state(action_win_handle,icon_filename,0x400000,0);
  648.   wimp_set_icon_state(action_win_handle,icon_savebutton,0x400000,0);
  649.   r.r[0] = 18;
  650.   r.r[1] = (int) file_uub;
  651.   r.r[2] = ftype;
  652.   _kernel_swi(OS_File, &r, &r);
  653.   caret_pos.w = action_win_handle;
  654.   caret_pos.i = icon_filename;
  655.   caret_pos.height = -1;
  656.   wimp_get_icon_info(action_win_handle,icon_filename,&result);
  657.   caret_pos.index = strlen(result.data.indirecttext.buffer);
  658.   wimp_set_caret_pos(&caret_pos);
  659.   ok_not_grey = TRUE;
  660.   drag_filetype = ftype;
  661. }
  662.  
  663.  
  664. /****************************** Decoding files ******************************/
  665.  
  666. static void base64_decode_and_save()
  667. {
  668.   wimp_get_icon_info(split_win_handle, 24, &result);
  669.   if((result.flags & wimp_ISELECTED) == 0) r.r[0] = 2;
  670.   else r.r[0] = 3;
  671.   r.r[1] = (int) file_uua;
  672.   r.r[2] = (int) file_uub;
  673.   pos_error = _kernel_swi(TypeTrans_FromBase64, &r, &r);
  674.   remove(file_uua);
  675.   if (pos_error != NULL)
  676.   {
  677.     wimp_reporterror((os_error *) pos_error, 0, "Attacher");
  678.     wimp_get_wind_state(action_win_handle, &state);
  679.     wimp_close_wind(action_win_handle);
  680.     reset_main_window();
  681.     wimp_open_wind(&state.o);
  682.     processing_base64 = FALSE;
  683.     unsafe_data = FALSE;
  684.     return;
  685.   }
  686.   setup_to_save((char*) r.r[4], r.r[3], 0);
  687.   visdelay_end();
  688. }
  689.  
  690. static void decode64(wimp_eventstr *e)
  691. {
  692.   BOOL first_line = FALSE;
  693.   BOOL second_line = FALSE;
  694.   BOOL disposition = FALSE;
  695.   BOOL boundary = FALSE;
  696.   int i;
  697.   char buf[36];
  698.   
  699.   return_to_wimp();
  700.   strcpy(file_to_code, e->data.msg.data.dataload.name);
  701.   input_file = fopen(e->data.msg.data.dataload.name, "rb");
  702.   while (!feof(input_file) && !first_line)
  703.   {
  704.     st_result = fgets(my_line, 255, input_file);
  705.     if(st_result == NULL) break;
  706.     for( i=0;i<15;i++) buf[i] = my_line[i] | 0x20;
  707.     if(strncmp(buf, "content-type: ", 14) == 0) first_line = TRUE;   
  708.   }
  709.   if (!first_line)
  710.   {
  711.     werr(FALSE, msgs_lookup("errore:No base64"));
  712.     reset_main_window();
  713.     unsafe_data = FALSE;
  714.     processing_base64 = FALSE;
  715.     remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!"); 
  716.     fclose(input_file);
  717.     return;
  718.   }
  719.   while (!feof(input_file) && !second_line)
  720.   {
  721.     st_result = fgets(my_line2, 255, input_file);
  722.     if(st_result == NULL) break;
  723.     for( i=0;i<34;i++) buf[i] = my_line2[i] | 0x20;
  724.     if(strncmp(buf, "content-type: ", 14) == 0)
  725.     {
  726.       for (i=0;i<255;i++) my_line[i] = my_line2[i];
  727.       disposition = FALSE;
  728.     }
  729.     if(strncmp(buf, "content-disposition: ", 21) == 0)
  730.     {
  731.       for (i=0;i<255;i++) my_line3[i] = my_line2[i];
  732.       disposition = TRUE;
  733.     }
  734.     if(strncmp(buf, "content-transfer-encoding: base64", 33) == 0) second_line = TRUE;
  735.   }
  736.   if (!second_line)
  737.   {
  738.     werr(FALSE, msgs_lookup("errore:No base64"));
  739.     reset_main_window();
  740.     unsafe_data = FALSE;
  741.     processing_base64 = FALSE;
  742.     remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!"); 
  743.     fclose(input_file);
  744.     return;
  745.   }
  746.   text_in_icon(action_win_handle, icon_info, "Processing base64 coded file");
  747.   return_to_wimp();
  748.   fgetpos(input_file, &file_position);
  749.   if (!disposition)
  750.   {
  751.     fgets(my_line3, 100, input_file);
  752.     for( i=0;i<21;i++) buf[i] = my_line3[i] | 0x20;
  753.     if(strncmp(buf, "content-disposition: ", 21) == 0) disposition = TRUE;
  754.   }
  755.   output_file = fopen(file_uua, "wb");
  756.   fputs(my_line, output_file);
  757.   if (disposition) fputs(my_line3, output_file);
  758.   fputs(my_line2, output_file);
  759.   fgets(my_line, 255, input_file);
  760.   fputs("\n", output_file);
  761.   fsetpos(input_file, &file_position);
  762.   fgets(my_line, 255, input_file);
  763.   while (strlen(my_line) > 2) fgets(my_line, 255, input_file);
  764.   fgets(my_line, 255, input_file);
  765.   boundary = FALSE;
  766.   while ((strlen(my_line) > 2) && !feof(input_file) && !boundary)
  767.   {
  768.     fputs(my_line, output_file);
  769.     fgets(my_line, 255, input_file);
  770.     if(strncmp(my_line, "-", 1) == 0) boundary = TRUE;
  771.   }
  772.   fputs("\n", output_file);
  773.   fclose(output_file);
  774.   fgetpos(input_file, &file_position);
  775.   fclose(input_file);
  776.   return_to_wimp();
  777.   base64_decode_and_save();
  778.   return;
  779. }
  780.  
  781. static void check_for_next_base64()
  782. {
  783.   BOOL first_line = FALSE;
  784.   BOOL second_line = FALSE;
  785.   BOOL disposition = FALSE;
  786.   int i;
  787.   char buf[36];
  788.   
  789.   return_to_wimp();
  790.   input_file = fopen(file_to_code, "rb");
  791.   fsetpos(input_file, &file_position);
  792.   while (!feof(input_file) && !first_line)
  793.   {
  794.     st_result = fgets(my_line, 255, input_file);
  795.     if(st_result == NULL) break;
  796.     for( i=0;i<15;i++) buf[i] = my_line[i] | 0x20;
  797.     if(strncmp(buf, "content-type: ", 14) == 0) first_line = TRUE;   
  798.   }
  799.   if (!first_line)
  800.   {
  801.     reset_main_window();
  802.     processing_base64 = FALSE;
  803.     fclose(input_file);
  804.     remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!"); 
  805.     visdelay_end();
  806.     return;
  807.   }
  808.   while (!feof(input_file) && !second_line)
  809.   {
  810.     st_result = fgets(my_line2, 255, input_file);
  811.     if(st_result == NULL) break;
  812.     for( i=0;i<34;i++) buf[i] = my_line2[i] | 0x20;
  813.     if(strncmp(buf, "content-type: ", 14) == 0)
  814.     {
  815.       for (i=0;i<255;i++) my_line[i] = my_line2[i];
  816.       disposition = FALSE;
  817.     }
  818.     if(strncmp(buf, "content-disposition: ", 21) == 0)
  819.     {
  820.       for (i=0;i<255;i++) my_line3[i] = my_line2[i];
  821.       disposition = TRUE;
  822.     }
  823.     if(strncmp(buf, "content-transfer-encoding: base64", 33) == 0) second_line = TRUE;
  824.   }
  825.   if (!second_line)
  826.   {
  827.     reset_main_window();
  828.     processing_base64 = FALSE;
  829.     fclose(input_file);
  830.     remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!"); 
  831.     visdelay_end();
  832.     return;
  833.   }
  834.   unsafe_data = TRUE;
  835.   text_in_icon(action_win_handle, icon_info, "Processing base64 coded file");
  836.   if (!disposition)
  837.   {
  838.     fgetpos(input_file, &file_position);
  839.     fgets(my_line3, 100, input_file);
  840.     for( i=0;i<21;i++) buf[i] = my_line3[i] | 0x20;
  841.     if(strncmp(buf, "content-disposition: ", 21) == 0) disposition = TRUE;
  842.   }
  843.   return_to_wimp();
  844.   output_file = fopen(file_uua, "wb");
  845.   fputs(my_line, output_file);
  846.   if (disposition) fputs(my_line3, output_file);
  847.   fputs(my_line2, output_file);
  848.   fputs("\n", output_file);
  849.   fsetpos(input_file, &file_position);
  850.   fgets(my_line, 255, input_file);
  851.   while (strlen(my_line) > 2) fgets(my_line, 255, input_file);
  852.   fgets(my_line, 255, input_file);
  853.   while ((strlen(my_line) > 2) && !feof(input_file))
  854.   {
  855.     fputs(my_line, output_file);
  856.     fgets(my_line, 255, input_file);
  857.   }
  858.   fputs("\n", output_file);
  859.   fclose(output_file);
  860.   fgetpos(input_file, &file_position);
  861.   fclose(input_file);
  862.   return_to_wimp();
  863.   base64_decode_and_save();
  864.   return;
  865. }
  866.  
  867. static void decode_and_save()
  868. {
  869.   wimp_get_icon_info(split_win_handle, 24, &result);
  870.   if((result.flags & wimp_ISELECTED) == 0) r.r[0] = 2;
  871.   else r.r[0] = 3;
  872.   r.r[1] = (int) file_uua;
  873.   r.r[2] = (int) file_uub;
  874.   pos_error = _kernel_swi(TypeTrans_FromUUcode, &r, &r);
  875.   remove(file_uua);
  876.   if (pos_error != NULL)
  877.   {
  878.     wimp_reporterror((os_error *) pos_error, 0, "Attacher");
  879.     wimp_get_wind_state(action_win_handle, &state);
  880.     wimp_close_wind(action_win_handle);
  881.     reset_main_window();
  882.     wimp_open_wind(&state.o);
  883.     processing_uucode = FALSE;
  884.     unsafe_data = FALSE;
  885.     return;
  886.   }
  887.   strcpy(my_line, (char*)r.r[4]);
  888.   setup_to_save(my_line, r.r[3], 0);
  889.   visdelay_end();
  890. }
  891.  
  892. static BOOL transfer_body()
  893. {
  894.   found_end = FALSE;
  895.   while (TRUE)
  896.   {
  897.     fputs(my_line,output_file);
  898.     st_result = fgets(my_line, 255, input_file);
  899.     if (st_result == NULL) break;
  900.     if ((my_line[0] != Mchar) || (strlen(my_line) != Slen)) break;
  901.   }
  902.   if (st_result != NULL)
  903.   {
  904.     st_result = fgets(my_line2, 255, input_file);
  905.     if (st_result != NULL)
  906.     {
  907.       if (strncmp(my_line2, "end", 3) == 0)
  908.       {
  909.         fputs(my_line, output_file);
  910.         if ((strncmp(my_line, "`", 1) != 0) && (Slen > 60)) fputs("`\n", output_file);
  911.         fputs(my_line2, output_file);
  912.         found_end = TRUE;
  913.       }
  914.       else
  915.       {
  916.         st_result = fgets(my_line3, 255, input_file);
  917.         if (st_result != NULL)
  918.         {
  919.           if (strncmp(my_line3, "end", 3) == 0)
  920.           {
  921.             fputs(my_line, output_file);
  922.             fputs(my_line2, output_file);
  923.             fputs(my_line3, output_file);
  924.             found_end = TRUE;
  925.           }
  926.         }
  927.       }
  928.     }
  929.   }
  930.   fgetpos(input_file, &file_position);
  931.   if (found_end)
  932.   {
  933.     st_result = fgets(my_line, 255, input_file);
  934.     if (st_result != NULL) fputs(my_line, output_file);
  935.     text_in_icon(action_win_handle, icon_info, "Decoding complete uuencoded file");
  936.     return_to_wimp();
  937.   }
  938.   fclose(output_file);
  939.   fclose(input_file);
  940.   if (found_end) return(TRUE);
  941.   text_in_icon(action_win_handle, icon_info, "Waiting for next section of uuencoded file ...");
  942.   visdelay_end();
  943.   return(FALSE);
  944. }
  945.  
  946. static void check_for_next()
  947. {
  948.   wimp_wstate state;
  949.   
  950.   visdelay_begin();
  951.   input_file = fopen(file_to_code, "rb");
  952.   if (input_file == NULL)
  953.   {
  954.     werr(FALSE, msgs_lookup("error8: can't open source file"));
  955.     reset_main_window();
  956.     return;
  957.   }
  958.   fsetpos(input_file, &file_position);
  959.   while (!feof(input_file))
  960.   {
  961.     fgets(my_line, 255, input_file);
  962.     if(strncmp(my_line, "begin ", 6) == 0) break;
  963.   }
  964.   if (!feof(input_file))
  965.   {
  966.     text_in_icon(action_win_handle, icon_info, "Processing a further uucoded file");
  967.     return_to_wimp();
  968.     output_file = fopen(file_uua, "wb");
  969.     fputs(my_line, output_file);
  970.     st_result = fgets(my_line, 255, input_file);
  971.     if (st_result == NULL)
  972.     {
  973.       werr(FALSE, msgs_lookup("error9:Faulty file"));
  974.       fclose(input_file);
  975.       fclose(output_file);
  976.       reset_main_window();
  977.       remove(file_uua);
  978.       return;
  979.     }
  980.     Mchar = (int) my_line[0];
  981.     Slen = strlen(my_line);
  982.     unsafe_data = TRUE;
  983.     if (transfer_body()) decode_and_save();
  984.     return;
  985.   } 
  986.   fclose(input_file); 
  987.   remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!"); 
  988.   wimp_get_wind_state(action_win_handle, &state);
  989.   wimp_close_wind(action_win_handle);
  990.   reset_main_window();
  991.   wimp_open_wind(&state.o);
  992.   processing_uucode = FALSE;
  993.   visdelay_end();
  994. }
  995.  
  996. static void examine_file(wimp_eventstr *e)
  997. {
  998.   int j;
  999.   
  1000.   text_in_icon(action_win_handle, icon_info, "Processing file");
  1001.   visdelay_begin();
  1002.   return_to_wimp();
  1003.   input_file = fopen(e->data.msg.data.dataload.name, "rb");
  1004.   strcpy(file_to_code, e->data.msg.data.dataload.name);
  1005.   if (input_file == NULL)
  1006.   {
  1007.     werr(FALSE, msgs_lookup("error8: can't open source file"));
  1008.     reset_main_window();
  1009.     return;
  1010.   }
  1011.   while (!feof(input_file) && !processing_uucode && !processing_base64)
  1012.   {
  1013.     fgets(my_line, 255, input_file);
  1014.     for(j=0;j<34;j++) my_line2[j] = my_line[j] | 0x20;
  1015.     if(strncmp(my_line, "begin ", 6) == 0) processing_uucode = TRUE;
  1016.     if(strncmp(my_line2, "content-transfer-encoding: base64", 33) == 0) processing_base64 = TRUE;
  1017.   }
  1018.   if (processing_uucode)
  1019.   {
  1020.     text_in_icon(action_win_handle, icon_info, "Processing uucoded file");
  1021.     wimp_set_icon_state(action_win_handle,icon_uuencode,0x400000,0);
  1022.     wimp_set_icon_state(action_win_handle,icon_64encode,0x400000,0);
  1023.     return_to_wimp();
  1024.     output_file = fopen(file_uua, "wb");
  1025.     fputs(my_line, output_file);
  1026.     st_result = fgets(my_line, 255, input_file);
  1027.     if (st_result == NULL)
  1028.     {
  1029.       werr(FALSE, msgs_lookup("error9:Faulty file"));
  1030.       fclose(input_file);
  1031.       fclose(output_file);
  1032.       reset_main_window();
  1033.       remove(file_uua);
  1034.       return;
  1035.     }
  1036.     Mchar = (int) my_line[0];
  1037.     Slen = strlen(my_line);
  1038.     unsafe_data = TRUE;
  1039.     if (transfer_body()) decode_and_save();
  1040.     return;
  1041.   }  
  1042.   if (processing_base64)
  1043.   {
  1044.     fclose(input_file);
  1045.     unsafe_data = TRUE;
  1046.     decode64(e);
  1047.     return;
  1048.   } 
  1049.   fclose(input_file);  
  1050.   visdelay_end();
  1051.   werr(FALSE, msgs_lookup("error2:No coded data"));
  1052.   wimp_get_wind_state(action_win_handle, &state);
  1053.   wimp_close_wind(action_win_handle);
  1054.   reset_main_window();
  1055.   wimp_open_wind(&state.o);
  1056.   return;
  1057. }
  1058.  
  1059. static void next_uucode_bit(wimp_eventstr *e)
  1060. {
  1061.   text_in_icon(action_win_handle, icon_info, "Processing file");
  1062.   visdelay_begin();
  1063.   return_to_wimp();
  1064.   input_file = fopen(e->data.msg.data.dataload.name, "rb");
  1065.   strcpy(file_to_code, e->data.msg.data.dataload.name);
  1066.   if (input_file == NULL)
  1067.   {
  1068.     werr(FALSE, msgs_lookup("error8: can't open source file"));
  1069.     reset_main_window();
  1070.     return;
  1071.   }
  1072.   while (feof(input_file) == 0)
  1073.   {
  1074.     fgets(my_line, 255, input_file);
  1075.     if ((my_line[0] == Mchar) && (strlen(my_line) == Slen)) break;
  1076.   }
  1077.   text_in_icon(action_win_handle, icon_info, "Processing uucoded file");
  1078.   return_to_wimp();
  1079.   output_file = fopen(file_uua, "ab");
  1080.   if (transfer_body()) decode_and_save();
  1081.   return;  
  1082. }
  1083.  
  1084. /******************************* General Handlers ***********************/
  1085.  
  1086. static BOOL save_to_file(char *filename)
  1087. {
  1088.   BOOL success = TRUE;
  1089.   
  1090.   pos_error = NULL;
  1091.   visdelay_begin();
  1092.   text_in_icon(action_win_handle,icon_info,"Saving file");
  1093.   if (splitting_file) success = save_split_file(filename);
  1094.   else
  1095.   {
  1096.     r.r[0] = 26;
  1097.     r.r[1] = (int) file_uub;
  1098.     r.r[2] = (int) filename;
  1099.     r.r[3] = 130;
  1100.     pos_error = _kernel_swi(XOS_FSControl, &r, &r);
  1101.   }
  1102.   if(pos_error != NULL || !success) 
  1103.   {
  1104.     wimp_reporterror((os_error *) pos_error, 17, "Attacher");
  1105.     text_in_icon(action_win_handle,icon_info,"Correct the name and save the file");
  1106.     success = TRUE;
  1107.     return TRUE;
  1108.   }
  1109.   visdelay_end();
  1110.   if (splitting_file) 
  1111.   {
  1112.     split_fname();
  1113.     return TRUE;
  1114.   }
  1115.   caret_pos.w = action_win_handle;
  1116.   caret_pos.i = -1;
  1117.   wimp_set_caret_pos(&caret_pos);
  1118.   wimp_get_wind_state(action_win_handle, &state);
  1119.   wimp_close_wind(action_win_handle);
  1120.   reset_main_window();
  1121.   if (processing_uucode || processing_base64)
  1122.   {
  1123.     wimp_set_icon_state(action_win_handle,icon_uuencode,0x400000,0);
  1124.     wimp_set_icon_state(action_win_handle,icon_64encode,0x400000,0);
  1125.   }
  1126.   wimp_open_wind(&state.o);
  1127.   unsafe_data = FALSE;
  1128.   return TRUE;
  1129. }
  1130.  
  1131. static void click_ok()
  1132. {
  1133.   wimp_get_icon_info(action_win_handle,icon_filename,&result);
  1134.   if (!strstr(result.data.indirecttext.buffer,"::"))
  1135.   {
  1136.     werr(FALSE,msgs_lookup("error1:To save drag the file to a directory"));
  1137.     return;
  1138.   }
  1139.   if (splitting_file) save_split_file(result.data.indirecttext.buffer);
  1140.   else save_to_file(result.data.indirecttext.buffer);
  1141. }
  1142.  
  1143. static BOOL launch_file(char *fname, int ftype, BOOL help)
  1144. {
  1145.   wimp_eventstr e;
  1146.   
  1147.   open.hdr.size = 256;
  1148.   open.hdr.your_ref = 0;
  1149.   open.hdr.action = wimp_MDATAOPEN;
  1150.   open.data.dataopen.w = action_win_handle;
  1151.   open.data.dataopen.i = 0;
  1152.   open.data.dataopen.x = 0;
  1153.   open.data.dataopen.y = 0;
  1154.   open.data.dataopen.size = 0;
  1155.   open.data.dataopen.type = ftype;
  1156.   strcpy(open.data.dataopen.name, fname);
  1157.   wimp_sendmessage(18, &open, 0);
  1158.   wimp_poll( 0x1973, &e);
  1159.   if((e.e == wimp_ESENDWANTACK) && (e.data.msg.hdr.action ==  wimp_MDATAOPEN)) wimp_poll( 0x1973, &e);
  1160.   if((e.e != wimp_ESEND) && (e.e != wimp_ESENDWANTACK) && (e.e != wimp_EACK)) return TRUE;
  1161.   if ((e.e != wimp_EACK) || (e.data.msg.hdr.action != 5)) 
  1162.   {
  1163.     unsafe_data = FALSE;
  1164.     return TRUE;
  1165.   }
  1166.   sprintf(my_line3, "Alias$@RunType_%03x\0", ftype);
  1167.   r.r[0] = (int) my_line3;
  1168.   r.r[2] = -1;
  1169.   _kernel_swi(OS_ReadVarVal, &r, &r);
  1170.   if (r.r[2] == 0)
  1171.   {
  1172.     werr(FALSE, msgs_lookup("error6:No run action"));
  1173.     if (help) return FALSE;
  1174.     r.r[0] = 25;
  1175.     r.r[1] = (int) fname;
  1176.     r.r[2] = (int) file_uub;
  1177.     _kernel_swi(OS_FSControl, &r, &r);
  1178.     return FALSE;
  1179.   }
  1180.   return_to_wimp();
  1181.   wimp_starttask(fname);
  1182.   unsafe_data = FALSE;
  1183.   visdelay_end();
  1184.   return TRUE;
  1185. }
  1186.  
  1187. static void dataload_routine (wimp_eventstr *e)
  1188. {
  1189.   check_scrap_exists();
  1190.   if(e->data.msg.data.dataload.i == 2) /* uuencode */
  1191.   {
  1192.     visdelay_begin();
  1193.     test_for_full_scrap();
  1194.     text_in_icon(action_win_handle, icon_info, "uuencoding file");
  1195.     return_to_wimp();
  1196.     if (uu_add_ext) r.r[0] = 37;
  1197.     else r.r[0] = 36;
  1198.     r.r[1] = (int) e->data.msg.data.dataload.name;
  1199.     r.r[2] = (int) file_uub;
  1200.     r.r[3] = e->data.msg.data.dataload.type;
  1201.     r.r[4] = 0;
  1202.     pos_error = _kernel_swi(TypeTrans_ToUUcode, &r, &r);
  1203.     return_to_wimp();
  1204.     if (pos_error == NULL) setup_to_save(default_file, 0xfff, 1);
  1205.     else 
  1206.     {
  1207.       werr(FALSE , msgs_lookup("errora:cannot encode file"));
  1208.       remove(file_uub);
  1209.     }
  1210.     unsafe_data = TRUE;
  1211.     remove("<Wimp$Scrap>");
  1212.     visdelay_end();
  1213.     return;
  1214.   }
  1215.   if(e->data.msg.data.dataload.i == 1) /* uudecode */
  1216.   {
  1217.     if (processing_uucode) next_uucode_bit(e);
  1218.     test_for_full_scrap();
  1219.     if (!processing_base64 && !processing_uucode) examine_file(e);
  1220.     return;
  1221.   }
  1222.   if(e->data.msg.data.dataload.i == 3) /* base64 encode */
  1223.   {
  1224.     visdelay_begin();
  1225.     test_for_full_scrap();
  1226.     text_in_icon(action_win_handle, icon_info, "MIME base64 coding file");
  1227.     return_to_wimp();
  1228.     if (base64_add_ext) r.r[0] = 3;
  1229.     else r.r[0] = 2;
  1230.     r.r[1] = (int) e->data.msg.data.dataload.name;
  1231.     r.r[2] = (int) file_uub;
  1232.     r.r[3] = e->data.msg.data.dataload.type;
  1233.     r.r[4] = 0;
  1234.     pos_error = _kernel_swi(TypeTrans_ToBase64, &r, &r);
  1235.     return_to_wimp();
  1236.     if (pos_error == NULL) setup_to_save(base64_default, 0xfff, 2);
  1237.     else 
  1238.     {
  1239.       werr(FALSE , msgs_lookup("errorc:cannot base64 code file"));
  1240.       remove(file_uub);
  1241.     }
  1242.     unsafe_data = TRUE;
  1243.     remove("<Wimp$Scrap>");
  1244.     visdelay_end();
  1245.     return;
  1246.   }
  1247. }
  1248.  
  1249. /******************************WINDOW EVENTS ******************************/
  1250. static void action_event_handler(wimp_eventstr *e, void *handle)
  1251. {
  1252.   wimp_t sender;
  1253.   wimp_mousestr mouse_inf;
  1254.   char *last_pointer, *leaf_name, *point, *task_name;
  1255.   
  1256.   handle=handle;
  1257.   if(help_process(e)) return;
  1258.  
  1259.   switch(e->e)
  1260.   {
  1261.     case wimp_ENULL:
  1262.       wimp_get_point_info(&mouse_inf);
  1263.       if (mouse_inf.w != action_win_handle) break;
  1264.       switch (mouse_inf.i)
  1265.       {
  1266.         case icon_decode:
  1267.           if (icon_decode != help_icon)
  1268.           {
  1269.             text_in_icon(action_win_handle, icon_help, "Decode uucode/base64");
  1270.             help_icon = icon_decode;
  1271.           }
  1272.           break;
  1273.           
  1274.         case icon_uuencode:
  1275.           if (icon_uuencode != help_icon)
  1276.           {
  1277.             text_in_icon(action_win_handle, icon_help, "UUencode file");
  1278.             help_icon = icon_uuencode;
  1279.           }
  1280.           break;
  1281.           
  1282.         case icon_64encode:
  1283.           if (icon_64encode != help_icon)
  1284.           {
  1285.             text_in_icon(action_win_handle, icon_help, "base64 code file");
  1286.             help_icon = icon_64encode;
  1287.           }
  1288.           break;
  1289.           
  1290.         default:
  1291.           if (help_icon != -1)
  1292.           {
  1293.             text_in_icon(action_win_handle, icon_help, "");
  1294.             help_icon = -1;
  1295.           }
  1296.           break;
  1297.       }
  1298.       break;
  1299.       
  1300.     case wimp_EOPEN:
  1301.       wimp_open_wind(&e->data.o);
  1302.       break;
  1303.       
  1304.     case wimp_ECLOSE:
  1305.       if (unsafe_data && !(dboxquery("Closing the window will lose unsaved data, do you really want to discard this data?")==1)) break;
  1306.       wimp_close_wind(e->data.o.w);
  1307.       wimp_set_icon_state(split_win_handle,11,0,wimp_INOSELECT);
  1308.       wimp_set_icon_state(split_win_handle,5,0,wimp_INOSELECT);
  1309.       my_win_open = FALSE;
  1310.       unsafe_data = FALSE;
  1311.       splitting_file = FALSE;
  1312.       already_found_a_file = FALSE;
  1313.       processing_uucode = FALSE;
  1314.       processing_base64 = FALSE;
  1315.       remove(file_uua);
  1316.       remove(file_uub);
  1317.       break; 
  1318.       
  1319.     case wimp_EPTRLEAVE:
  1320.       event_setmask(1);
  1321.       text_in_icon(action_win_handle, icon_help, "");
  1322.       help_icon = -1;
  1323.       break;
  1324.       
  1325.     case wimp_EPTRENTER:
  1326.       event_setmask(0);
  1327.       break; 
  1328.  
  1329.     case wimp_EKEY:
  1330.       if(e->data.key.chcode == 13 && ok_not_grey)
  1331.       {
  1332.         click_ok();
  1333.         break;
  1334.       }
  1335.       else wimp_processkey(e->data.key.chcode);
  1336.       break;
  1337.       
  1338.     case wimp_EBUT:
  1339.       if(e->data.but.m.i == icon_cancel)
  1340.       {
  1341.         wimp_get_wind_state(action_win_handle, &state);
  1342.         if (unsafe_data) wimp_close_wind(action_win_handle);
  1343.         reset_main_window();
  1344.         if (unsafe_data) wimp_open_wind(&state.o);
  1345.         caret_pos.w = action_win_handle;
  1346.         caret_pos.i = -1;
  1347.         wimp_set_caret_pos(&caret_pos);
  1348.         unsafe_data = FALSE;
  1349.         processing_uucode = FALSE;
  1350.         processing_base64 = FALSE;
  1351.         remove("<Wimp$ScrapDir>.Attacher.!!Scrap!!");
  1352.         remove(file_uua);
  1353.         remove(file_uub);
  1354.         break;
  1355.       }
  1356.       if(e->data.but.m.i == icon_discard)
  1357.       {
  1358.         if(unsafe_data == FALSE) break;
  1359.         caret_pos.w = action_win_handle;
  1360.         caret_pos.i = -1;
  1361.         wimp_set_caret_pos(&caret_pos);
  1362.         wimp_get_wind_state(action_win_handle, &state);
  1363.         wimp_close_wind(action_win_handle);
  1364.         reset_main_window();
  1365.         if (processing_uucode || processing_base64)
  1366.         {
  1367.           wimp_set_icon_state(action_win_handle,icon_uuencode,0x400000,0);
  1368.           wimp_set_icon_state(action_win_handle,icon_64encode,0x400000,0);
  1369.         }
  1370.         wimp_open_wind(&state.o);
  1371.         remove(file_uua);
  1372.         remove(file_uub);
  1373.         unsafe_data = FALSE;        
  1374.         if(processing_uucode) check_for_next();
  1375.         if(processing_base64) check_for_next_base64();
  1376.         break;
  1377.       }
  1378.       if(e->data.but.m.i == icon_savebutton)
  1379.       {
  1380.         click_ok();
  1381.         break;
  1382.       }
  1383.       if((e->data.but.m.i == icon_savefile) && (e->data.but.m.bbits == wimp_BDRAGLEFT)  && ok_not_grey)
  1384.       {
  1385.         wimp_set_icon_state(action_win_handle, icon_savefile, 0, wimp_ISELECTED);
  1386.         start_the_drag();
  1387.         break;
  1388.       }
  1389.       
  1390.       if((e->data.but.m.i == icon_savefile) && (e->data.but.m.bbits == wimp_BLEFT))
  1391.       {
  1392.         if(splitting_file) break;
  1393.         wimp_set_icon_state(action_win_handle, icon_savefile, 0, wimp_ISELECTED);
  1394.         wimp_get_icon_info(action_win_handle, icon_filename, &result);
  1395.         sprintf(my_line, ".%s\0", result.data.indirecttext.buffer);
  1396.         last_pointer = my_line;
  1397.         while (last_pointer != NULL)
  1398.         {
  1399.           leaf_name = last_pointer + 1;
  1400.           last_pointer = strchr(last_pointer + 1, 46);
  1401.         }
  1402.         sprintf(my_line2, "%s.%s\0", scrap_dir, leaf_name);
  1403.         remove(my_line2);
  1404.         rename(file_uub, my_line2);
  1405.         remove("<Wimp$Scrap>");
  1406.         if(launch_file(my_line2, drag_filetype, FALSE))
  1407.         {
  1408.           reset_main_window();
  1409.           caret_pos.w = action_win_handle;
  1410.           caret_pos.i = -1;
  1411.           wimp_set_caret_pos(&caret_pos);
  1412.           wimp_get_wind_state(action_win_handle, &state);
  1413.           wimp_close_wind(action_win_handle);
  1414.           reset_main_window();
  1415.           if (processing_uucode || processing_base64)
  1416.           {
  1417.             wimp_set_icon_state(action_win_handle,icon_uuencode,0x400000,0);
  1418.             wimp_set_icon_state(action_win_handle,icon_64encode,0x400000,0);
  1419.           }
  1420.           else unsafe_data = FALSE;
  1421.           wimp_open_wind(&state.o);
  1422.           if (processing_uucode) check_for_next();
  1423.           if (processing_base64) check_for_next_base64();
  1424.         }
  1425.         visdelay_end();
  1426.         break;
  1427.       }
  1428.       break;
  1429.       
  1430.     case wimp_EUSERDRAG:
  1431.       wimp_get_point_info(&mouse_inf);
  1432.       if(mouse_inf.w == action_win_handle) break;
  1433.       if((mouse_inf.w == -2) && (mouse_inf.i == my_ibar_icon)) break;
  1434.       msg.hdr.size = 256;
  1435.       msg.hdr.task = mouse_inf.w;
  1436.       msg.hdr.your_ref = 0;
  1437.       msg.hdr.action = wimp_MDATASAVE;
  1438.       msg.data.datasave.w = mouse_inf.w;
  1439.       msg.data.datasave.i = mouse_inf.i;
  1440.       msg.data.datasave.x = mouse_inf.x;
  1441.       msg.data.datasave.y = mouse_inf.y;
  1442.       msg.data.datasave.type = drag_filetype;
  1443.       msg.data.datasave.estsize = 0;
  1444.       {
  1445.         int i, tail;
  1446.         char name[256];
  1447.         wimp_get_icon_info(action_win_handle, icon_filename, &result);
  1448.         strncpy(name, result.data.indirecttext.buffer, 256);
  1449.         for(i = 0; i <=256; i++) if ((int) name[i] < 32) name[i] = '\0'; 
  1450.         tail = strlen(name);
  1451.         while ((tail > 0) && (name[tail-1] != '.') && (name[tail-1] != ':')) tail--;
  1452.         for (i = 0; i <= 200; i++) msg.data.datasave.leaf[i] = name[tail++];
  1453.         msg.data.datasave.leaf[200] = '\0'; 
  1454.       }
  1455.       wimpt_noerr(wimp_sendwmessage(wimp_ESEND, &msg, mouse_inf.w, mouse_inf.i));
  1456.       break;
  1457.       
  1458.     case wimp_ESEND:
  1459.     case wimp_ESENDWANTACK:
  1460.       if(e->data.msg.hdr.action == wimp_MPREQUIT)
  1461.       {
  1462.         prequit = TRUE;
  1463.         if (unsafe_data)
  1464.         {
  1465.           e->data.msg.hdr.your_ref = e->data.msg.hdr.my_ref;
  1466.           sender = e->data.msg.hdr.task;
  1467.           wimp_sendmessage(wimp_EACK, &e->data.msg, sender);
  1468.           if (!(dboxquery("Attacher has unsaved data, do you really want to quit the desktop and discard this data?")==1)) break; 
  1469.           else 
  1470.           {
  1471.             unsafe_data = FALSE;
  1472.             open.data.words[1] = 0x1fc;
  1473.             wimp_sendmessage(8, &open, sender);
  1474.           }
  1475.         }
  1476.         break;
  1477.       }
  1478.       if(e->data.msg.hdr.action == wimp_MINITTASK)
  1479.       {
  1480.         if(e->data.msg.hdr.task != wimpt_task())
  1481.         {
  1482.           task_name = e->data.msg.data.chars + 8;
  1483.           point = strstr(task_name, "Attacher");
  1484.           if ((point != NULL))
  1485.           {
  1486.             werr(FALSE, msgs_lookup("error0:Already running"));
  1487.             msg.hdr.size = 256;
  1488.             msg.hdr.your_ref = 0;
  1489.             msg.hdr.action = wimp_MCLOSEDOWN;
  1490.             wimp_sendmessage(wimp_ESEND, &msg, e->data.msg.hdr.task);
  1491.           }
  1492.         }
  1493.       }
  1494.       if(e->data.msg.hdr.action == wimp_MHELPREQUEST)
  1495.       {
  1496.         process_help_message(e);
  1497.         break;
  1498.       }
  1499.       if(e->data.msg.hdr.action == wimp_MDATASAVE)
  1500.       {
  1501.         if((e->data.msg.data.datasave.i < 1) || (e->data.msg.data.datasave.i > 3)) break;
  1502.         if(e->data.msg.data.datasave.type > 0xfff) break;
  1503.         if(e->data.msg.hdr.task == wimpt_task()) break;
  1504.         check_scrap_exists();
  1505.         reply_with_scrap(e);
  1506.         break;
  1507.       }
  1508.       if(e->data.msg.hdr.action == wimp_MDATALOAD)
  1509.       {
  1510.         if (ok_not_grey) break;
  1511.         if((e->data.msg.data.datasave.i < 1) || (e->data.msg.data.datasave.i > 3)) break;
  1512.         acknowledge_receipt(e);
  1513.         if(e->data.msg.data.dataload.type > 0xfff)
  1514.         { 
  1515.           r.r[0] = 17;
  1516.           r.r[1] = (int) e->data.msg.data.dataload.name;
  1517.           _kernel_swi(OS_Find, &r, &r);
  1518.           if(r.r[0] != 1)
  1519.           {
  1520.             werr(FALSE, msgs_lookup("error3:Cannot code or decode"));
  1521.             fclose(input_file);
  1522.             break;
  1523.           }
  1524.         }
  1525.         if (!splitting_file) dataload_routine(e);
  1526.         break;
  1527.       }  
  1528.       if(e->data.msg.hdr.action == wimp_MDATASAVEOK)
  1529.       {
  1530.         if (splitting_file) save_split_file(e->data.msg.data.datasaveok.name);
  1531.         else save_to_file(e->data.msg.data.datasaveok.name);
  1532.         e->data.msg.hdr.your_ref = e->data.msg.hdr.my_ref;
  1533.         e->data.msg.hdr.action = wimp_MDATALOAD;
  1534.         e->data.msg.data.dataload.type = drag_filetype;
  1535.         wimpt_noerr(wimp_sendmessage(wimp_ESENDWANTACK, &e->data.msg,e->data.msg.hdr.task));
  1536.         if(processing_uucode) check_for_next();
  1537.         if(processing_base64) check_for_next_base64();
  1538.         break;
  1539.       }    
  1540.  
  1541.     default:
  1542.       break;
  1543.   }
  1544. }
  1545.  
  1546. /********************************* MENU EVENTS ****************************/
  1547. static void my_menuproc(void *handle, char *hit)
  1548. {
  1549.   handle=handle;
  1550.  
  1551.   switch (hit[0])
  1552.   {
  1553.     case 1:
  1554.       dbox_show(info_box_handle);
  1555.       dbox_fillin(info_box_handle);
  1556.       dbox_hide(info_box_handle);
  1557.       break;
  1558.       
  1559.     case 2:
  1560.       handle_uu_choices();
  1561.       break;
  1562.       
  1563.     case 3:
  1564.       handle_link();
  1565.       break;
  1566.       
  1567.     case 4:
  1568.       os_read_var_val("Wimp$ScrapDir", my_line, 255);
  1569.       sprintf(my_line2, "Filer_OpenDir %s.Attacher", my_line);
  1570.       os_cli(my_line2);
  1571.       break;
  1572.             
  1573.     case 5:
  1574.       launch_file("<Attacher$Help>", 0xfff, TRUE);
  1575.       break;
  1576.       
  1577.     case 6:
  1578.       if (unsafe_data && !(dboxquery("Quitting will lose unsaved data, do you really want to discard this data?")==1)) break;
  1579.       prequit = TRUE;
  1580.       exit(0);
  1581.    }
  1582. }
  1583. /****************************** INITIALISATION ****************************/
  1584.  
  1585. static void initialise(void)
  1586.   int st_result1;
  1587.   
  1588.   wimpt_wimpversion(310);
  1589.   wimpt_init("Attacher");
  1590.   res_init("Attacher");
  1591.   resspr_init();
  1592.   template_init();
  1593.   msgs_init();
  1594.   dbox_init();
  1595.   atexit(&exit_function);
  1596.  
  1597.   my_menu = menu_new("Attacher", ">Info,>Choices,>Links,Open Dir,Help,Quit");
  1598.   
  1599.   my_ibar_icon = baricon("!attacher", (int)resspr_area(), my_iconclick);
  1600.   event_attachmenu(win_ICONBAR, my_menu, my_menuproc, 0);
  1601.   
  1602.   wimp_create_wind(template_syshandle ("Action"),&action_win_handle);
  1603.   win_register_event_handler(action_win_handle, action_event_handler, 0);
  1604.   event_attachmenu(action_win_handle, my_menu, my_menuproc, 0);
  1605.   win_claim_unknown_events(action_win_handle);
  1606.   win_claim_idle_events(action_win_handle);
  1607.   open_main_window();
  1608.   
  1609.   info_box_handle=dbox_new("Info");
  1610.   dbox_setfield(info_box_handle,3,"© John Allen 1997-8");
  1611.   dbox_setfield(info_box_handle,4,"1.02 (01-Feb-1998)");
  1612.   strcpy(version_num, "1.02");
  1613.   dbox_raw_eventhandler(info_box_handle, help_dboxrawevents, "Info");
  1614.   links_box_handle = dbox_new("Links");
  1615.   dbox_raw_eventhandler(links_box_handle, help_dboxrawevents, "Links");
  1616.   
  1617.   split_box_handle=dbox_new("Split");
  1618.   split_length = 60;
  1619.   dbox_setnumeric(split_box_handle, 4, split_length);
  1620.   strcpy(split_prefix, "Part");
  1621.   strcpy(split_suffix, "/uue");
  1622.   strcpy(default_file, "uuencoded");
  1623.   strcpy(base64_default, "base64");
  1624.   dbox_setfield(split_box_handle, 8, split_prefix);
  1625.   dbox_setfield(split_box_handle, 10, split_suffix);
  1626.   dbox_setfield(split_box_handle, 14, default_file);
  1627.   dbox_setfield(split_box_handle, 26, base64_default);
  1628.   dbox_raw_eventhandler(split_box_handle, help_dboxrawevents, "Split");
  1629.   split_win_handle = dbox_syshandle(split_box_handle);
  1630.   wimp_set_icon_state(split_win_handle, 1, 0, wimp_ISELECTED);
  1631.   
  1632.   input_file = fopen("<Attacher$Dir>.Choices","rb");
  1633.   if (input_file != NULL)
  1634.   {
  1635.     st_result = fgets(my_line, 2, input_file);
  1636.     if (st_result != NULL)
  1637.     {
  1638.       if (strncmp(my_line,"0",1) == 0)
  1639.       {
  1640.         split_file = TRUE;
  1641.         wimp_set_icon_state(split_win_handle, 1, wimp_ISELECTED, wimp_ISELECTED);
  1642.       }
  1643.       st_result1 = fscanf(input_file, "%d\n", &split_length);
  1644.       if (st_result1 != EOF) dbox_setnumeric(split_box_handle, 4, split_length);
  1645.       st_result = fgets(split_prefix, 255, input_file);
  1646.       if (st_result != NULL) dbox_setfield(split_box_handle, 8, split_prefix);
  1647.       st_result = fgets(split_suffix, 10, input_file);
  1648.       if (st_result != NULL) dbox_setfield(split_box_handle, 10, split_suffix);
  1649.       st_result = fgets(default_file, 255, input_file);
  1650.       if (st_result != NULL) dbox_setfield(split_box_handle, 14, default_file);
  1651.       st_result = fgets(base64_default, 255, input_file);
  1652.       if (st_result != NULL) dbox_setfield(split_box_handle, 26, base64_default);
  1653.       st_result = fgets(my_line, 255, input_file);
  1654.       if (st_result != NULL)
  1655.       {
  1656.         if (strncmp(my_line,"0",1) == 0)
  1657.         {
  1658.           keep_ext = TRUE;
  1659.           wimp_set_icon_state(split_win_handle, 24, wimp_ISELECTED, wimp_ISELECTED); 
  1660.         }
  1661.       }
  1662.       st_result = fgets(my_line, 255, input_file);
  1663.       if (st_result != NULL)
  1664.       {
  1665.         if (strncmp(my_line,"0",1) == 0)
  1666.         {
  1667.           uu_add_ext = TRUE;
  1668.           wimp_set_icon_state(split_win_handle, 28, wimp_ISELECTED, wimp_ISELECTED); 
  1669.         }
  1670.       }
  1671.       st_result = fgets(my_line, 255, input_file);
  1672.       if (st_result != NULL)
  1673.       {
  1674.         if (strncmp(my_line,"0",1) == 0)
  1675.         {
  1676.           base64_add_ext = TRUE;
  1677.           wimp_set_icon_state(split_win_handle, 29, wimp_ISELECTED, wimp_ISELECTED); 
  1678.         }
  1679.       }
  1680.       load_choices_vals();
  1681.     }
  1682.   }
  1683.   fclose(input_file);
  1684.   
  1685.   os_read_var_val("Wimp$ScrapDir", my_line, 255);
  1686.   if(strlen(my_line) == 0) werr(TRUE, msgs_lookup("error5:No Wimp$ScrapDir"));
  1687.   
  1688.   help_register_handler(help_simplehandler, "Menu");
  1689.   
  1690.   strcpy(scrap_dir, "<Wimp$ScrapDir>.Attacher");
  1691.   r.r[0] = 8;
  1692.   r.r[1] = (int) scrap_dir;
  1693.   _kernel_swi(OS_File, &r, &r);
  1694.   strcpy(file_uua, scrap_dir);
  1695.   strcat(file_uua, ".!!uua!!");
  1696.   strcpy(file_uub, scrap_dir);
  1697.   strcat(file_uub, ".!!uub!!");
  1698.   
  1699.   help_icon = -1;
  1700. }
  1701. /******************************* MAIN PROGRAM *****************************/
  1702.  
  1703. int main()
  1704. {
  1705.   initialise();
  1706.   {
  1707.     while (TRUE)
  1708.       event_process();
  1709.   }
  1710.  
  1711.   return 0;
  1712. }
  1713.